from flask import Flask

from financial.resource.user import user_bp
from settings import dict_config


def create_app(run_type):
    app = Flask(__name__)

    app.config.from_object(dict_config.get(run_type))

    # 初始化SQLALchemy
    from common.models import db
    db.init_app(app)

    # 初始化日志器
    from common.utils.Financial_Logging import create_logger
    create_logger(app)

    # 初始化Migrate,可以执行命令：flask db init ;  flask db migrate; flask db upgrade;
    # 在执行命令时，发现执行不了，通过观看模块的使用方法发现：需要设置FLASK_APP环境变量.FLASK_APP 是用来说明Flask实例对象 app 所在的模块位置
    # 设置环境变量时又发现了新的错误，在pycharm的终端中使用set设置环境变量时（windows的cmd中设置环境变量用set），Pycharm中打开的终端是PowerShell而不是windows中的cmd.导致设置环境变量以后还是无法执行命令。
    # 最后解决办法：将pycharm中使用的终端修改为了windows中的cmd,然后设置的环境变量。
    # 注意：set设置的环境变量只在当前cmd窗口有效，cmd窗口关闭以后，将会失效。这意味着：在Pycharm
    # 的中使用cmd终端设置FLASK_APP时，当终端窗口关闭掉，在下一次执行模型迁移时，仍然要设置 FLASK_APP 这个环境变量。

    from flask_migrate import Migrate  # 初始化模型映射Migrate
    migrate = Migrate(app, db)

    # 初始化flask_redis
    from common.utils.Financial_Redis import fr
    fr.init_app(app)

    # 注册token认证的请求钩子
    from common.utils.request_path import jwt_request_auth
    app.before_request(jwt_request_auth)  # 注册钩子函数

    # 注册蓝图
    app.register_blueprint(user_bp)

    return app
